﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms
{
    public partial class frmAgregarEditarPedido : Form
    {
        DisancoEntities context;

        int clienteId = 0;
        public static Pagos PagoEf;
        int pedId;
        Pedido PedidoPrint;
        Pedido pedaimprimir;
        bool editMode = false;
        public static int IdOfertaAplicada;
        
        //int NroComp2 = 0;
        //int NroComp1 = 1;// VERRRR
        //Articulos articulovendido;

     
        private Font printFontTitulo = new Font("Calibri", 16, FontStyle.Bold);
        private Font printFontSubTitulo = new Font("Calibri", 14, FontStyle.Bold);

        private Font printFont = new Font("Calibri", 11);
        private Font FontTit = new Font("Calibri", 12);
        private Font miniprintFont = new Font("Calibri", 8);
        private Font printFontNormal10 = new Font("Calibri", 10);

        public frmAgregarEditarPedido()
        {
            InitializeComponent();  
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            GestionPedidos.FrmNotaCredito.notacred = false;
            validarBotones();
            btnImprimirPresup.Enabled = false;
        }

        public frmAgregarEditarPedido(int pedido_Id)
        {
            InitializeComponent();

            this.pedId = pedido_Id;
            editMode = true;
            GestionPedidos.FrmNotaCredito.notacred = false;
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            
            var ped = context.Pedido.FirstOrDefault(p => p.ped_id == pedido_Id);

            if (ped != null)
            {
                this.clienteId = ped.cliente_id;
                txtbCliNombre.Text = ped.Clientes.cliente_nombre;
                txtbCliDireccion.Text = ped.Clientes.cliente_direccion;
                txtbCliLocalidad.Text = ped.Clientes.cliente_localidad;
                txtbCliCuit.Text = ped.Clientes.cliente_cuit;
                txtbCliCondiva.Text = ped.Clientes.CondicionIVA.condicion_sigla;

                foreach (var lineaPed in ped.LineaPedido)
                {
                    int i = dgvListaArt.Rows.Add();

                    decimal precioBonificado = Funcion.PrecioBonificado(lineaPed.ped_precio, lineaPed.ped_oferta_bonif);

                    dgvListaArt.Rows[i].Cells["art_id"].Value = lineaPed.art_id;
                    dgvListaArt.Rows[i].Cells["art_codigo"].Value = lineaPed.Articulos.art_codigo;
                    dgvListaArt.Rows[i].Cells["cantidad"].Value = lineaPed.ped_cant;
                    dgvListaArt.Rows[i].Cells["art_nombre"].Value = lineaPed.Articulos.art_nombre;
                    dgvListaArt.Rows[i].Cells["precio_unitario"].Value = lineaPed.ped_precio;
                    dgvListaArt.Rows[i].Cells["oferta_descuento"].Value = lineaPed.ped_oferta_bonif;
                    dgvListaArt.Rows[i].Cells["precio_bonificado"].Value = precioBonificado;
                    dgvListaArt.Rows[i].Cells["precio_final"].Value = precioBonificado * lineaPed.ped_cant;
                }

                calcularTotales();
                validarBotones();
                btnImprimirPresup.Enabled = false;
            }
        }
        //
        //Funciones
        //
        void buscarCliente()
        {
            frmBuscarCliente BuscarCli = new frmBuscarCliente();
            DialogResult dr = BuscarCli.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                txtbCliNombre.Text = BuscarCli.clienteSeleccionado.cliente_nombre;
                txtbCliDireccion.Text = BuscarCli.clienteSeleccionado.cliente_direccion;
                txtbCliLocalidad.Text = BuscarCli.clienteSeleccionado.cliente_localidad;
                txtbCliCondiva.Text = BuscarCli.clienteSeleccionado.CondicionIVA.condicion_sigla;

                txtbCliCuit.Text = BuscarCli.clienteSeleccionado.cliente_cuit;
                clienteId = BuscarCli.clienteSeleccionado.cliente_id;

                txtbCliDireccion.ReadOnly = true;
                txtbCliLocalidad.ReadOnly = true;
                txtbCliNombre.ReadOnly = true;
                txtbCliCondiva.ReadOnly = true;
                txtbCliCuit.ReadOnly = true;

                validarBotones();
            }
        }
        
        public void calcularTotales()
        {
            decimal subtotal = 0;

            foreach (DataGridViewRow fila in dgvListaArt.Rows)
            {
                subtotal = subtotal + (decimal)fila.Cells["precio_final"].Value;
            }

            
            //Decimal iva = Decimal.Round(subtotal * Clases.Constantes.IVA, 2);
            //Decimal total = Decimal.Round(subtotal + iva, 2);

           //decimal subtotalsiniva =  Math.Round(subtotal / (1 + Clases.Constantes.IVA),2);
           subtotal = Decimal.Round(subtotal, 2);
           decimal iva = 0;
           //Decimal iva = Math.Round((subtotalsiniva * Clases.Constantes.IVA), 2);
           Decimal total = Decimal.Round(subtotal + iva, 2);

            txtSubTotal.Text = subtotal.ToString();
            txtbIva.Text = iva.ToString();
            txtbTotal.Text = total.ToString();
        }

        void eliminarArticulos()
        {
            DialogResult dr = MessageBox.Show("¿Seguro que desea eliminar estos articulos de la lista?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dr == System.Windows.Forms.DialogResult.Yes)
            {
                foreach (DataGridViewRow fila in dgvListaArt.SelectedRows)
                {
                    dgvListaArt.Rows.Remove(fila);
                }
                
                calcularTotales();
                validarBotones();
            }
        }

        void agregarArticulo()
        {
            if (dgvListaArt.Rows.Count == Constantes.maximoLineasFactura)
            {
                MessageBox.Show("No se pueden agregar mas articulos a este Presupuesto", "Información", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                frmArticuloVentaBuscar busqueda = new frmArticuloVentaBuscar(dgvListaArt);
                busqueda.Owner = this;
                DialogResult dr = busqueda.ShowDialog();
                validarBotones();

                if (dr == System.Windows.Forms.DialogResult.OK)
                {
                    if (verificarArticulo(busqueda.Articulo))
                    {
                        Articulos art = context.Articulos.FirstOrDefault(a => a.art_id == busqueda.Articulo);

                        int i = dgvListaArt.Rows.Add();

                        dgvListaArt.Rows[i].Cells["art_id"].Value = busqueda.Articulo;
                        dgvListaArt.Rows[i].Cells["art_codigo"].Value = art.art_codigo;
                        dgvListaArt.Rows[i].Cells["art_nombre"].Value = art.art_nombre;
                        dgvListaArt.Rows[i].Cells["cantidad"].Value = busqueda.Cantidad;
                        dgvListaArt.Rows[i].Cells["precio_unitario"].Value = busqueda.PrecioUnitario;
                        dgvListaArt.Rows[i].Cells["oferta_descuento"].Value = busqueda.Bonificacion;
                        dgvListaArt.Rows[i].Cells["precio_bonificado"].Value = Funcion.PrecioBonificado(busqueda.PrecioUnitario, busqueda.Bonificacion);
                        dgvListaArt.Rows[i].Cells["precio_final"].Value = busqueda.PrecioTotal;

                        calcularTotales();

                        validarBotones();
                    }
                    else
                    {
                        MessageBox.Show("El articulo ya fue seleccionado","Disanco Sanitarios",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    }
                }
            }
        }

        void guardarNuevoPedido()
        {
            try
            {
                Pedido nuevoPed = new Pedido();

                nuevoPed.cliente_id = this.clienteId;
                nuevoPed.ped_fecha = DateTime.Now;
                nuevoPed.ped_estado = Estado.Pendiente;

                foreach (DataGridViewRow fila in dgvListaArt.Rows)
                {
                    LineaPedido nuevaLinea = new LineaPedido();
                    
                    nuevaLinea.art_id = (int)fila.Cells["art_id"].Value;
                    nuevaLinea.ped_cant = (int)fila.Cells["cantidad"].Value;
                    nuevaLinea.ped_precio = (decimal)fila.Cells["precio_unitario"].Value;
                    nuevaLinea.ped_oferta_bonif = (decimal)fila.Cells["oferta_descuento"].Value;
                    nuevoPed.LineaPedido.Add(nuevaLinea);
                }

                context.Pedido.AddObject(nuevoPed);
                context.SaveChanges();
                MessageBox.Show("Presupuesto Guardado con exito", "Operación Exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information);
                pedaimprimir = nuevoPed;
                btnImprimirPresup.Enabled = true;
                //Imprimir(nuevoPed);
                //this.Close();
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

        void actualizarPedido()
        {
            var pedidoEditar = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);

            if (pedidoEditar != null)
            {
                pedidoEditar.cliente_id = this.clienteId;
                pedidoEditar.LineaPedido.Clear();

                foreach (DataGridViewRow fila in dgvListaArt.Rows)
                {
                    LineaPedido linea = new LineaPedido();

                    linea.art_id = (int)fila.Cells["art_id"].Value;
                    linea.ped_cant = (int)fila.Cells["cantidad"].Value;
                    linea.ped_precio = (decimal)fila.Cells["precio_unitario"].Value;
                    linea.ped_oferta_bonif = (decimal)fila.Cells["oferta_descuento"].Value;

                    pedidoEditar.LineaPedido.Add(linea);
                }

                context.SaveChanges();
                Pedido pedidoEdnvo = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);
               
                MessageBox.Show("Presupuesto Guardado con exito", "Operación Exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information);
                btnImprimirPresup.Enabled = true;
                pedaimprimir = pedidoEdnvo;
                //Imprimir(pedidoEdnvo);
                //this.Close();
            }
            else
            {
                MessageBox.Show("No se pudo recuperar el Presupuesto para editarlo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        bool verificarArticulo(int idArticulo)
        {
            foreach (DataGridViewRow fila in dgvListaArt.Rows)
            {
                if ((int)fila.Cells["art_id"].Value == idArticulo)
                {
                    return false;
                }
            }

            return true;
        }

        private void Imprimir(Pedido Pedido)
        {
            
                DialogResult dr = MessageBox.Show("¿Desea Imprimir este Presupuesto?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question,MessageBoxDefaultButton.Button2);
                PedidoPrint = Pedido;
                if (dr == System.Windows.Forms.DialogResult.Yes)
                {
                    printDocPedido.PrinterSettings.Copies = 2;
                    printDialogPedido.Document = printDocPedido;
                    DialogResult resultado = printDialogPedido.ShowDialog();
                    if (resultado == DialogResult.OK)
                    {
                        printDocPedido.PrinterSettings = printDialogPedido.PrinterSettings;
                        printPrevDialogPedido.Document = printDocPedido;
                        ((Form)printPrevDialogPedido).WindowState = FormWindowState.Maximized;
                        printPrevDialogPedido.ShowDialog();
                    }
                }

        }

        void validarBotones()
        {
            if (dgvListaArt.Rows.Count == 0)
                btnEliminarArticulo.Enabled = false;
            else
                btnEliminarArticulo.Enabled = true;

            if (clienteId == 0 || dgvListaArt.Rows.Count == 0)
                btnGuardarPedido.Enabled = false;
            else
                btnGuardarPedido.Enabled = true;
        }
        //
        //Eventos
        //
        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            buscarCliente();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (editMode)
                actualizarPedido();
            else
                guardarNuevoPedido();
        }
        
        private void btnAddArticulo_Click(object sender, EventArgs e)
        {
            agregarArticulo();
        }

        private void btnDelArticulo_Click(object sender, EventArgs e)
        {
            eliminarArticulos();
        }

        private void btnNuevoCli_Click(object sender, EventArgs e)
        {
            frmAgregarCliente agregarCliente = new frmAgregarCliente();
            agregarCliente.ShowDialog();

            if (agregarCliente.cliente_id != null)
            {
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
                var nuevoCliente = context.Clientes.FirstOrDefault(c => c.cliente_id == agregarCliente.cliente_id);

                txtbCliNombre.Text = nuevoCliente.cliente_nombre;
                txtbCliDireccion.Text = nuevoCliente.cliente_direccion;
                txtbCliLocalidad.Text = nuevoCliente.cliente_localidad;
                txtbCliCondiva.Text = nuevoCliente.CondicionIVA.condicion_sigla;
                txtbCliCuit.Text = nuevoCliente.cliente_cuit;
                clienteId = nuevoCliente.cliente_id;

                validarBotones();
            }
        }
        
        private void FrmVentaA_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F2)
            {
                e.Handled = true;
                this.btnBuscarCliente_Click(sender, e);
            }
            else
            {
                if (e.KeyCode == Keys.F3)
                {
                    e.Handled = true;
                    this.btnAddArticulo_Click(sender, e);
                }
                else
                {
                    if (e.KeyCode == Keys.F5)
                    {
                        e.Handled = true;
                        this.btnGuardar_Click(sender, e);
                    }
                
                }


            }
        }
        
        private void printDocPedido_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
        context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
    
           //e.Graphics.DrawImage(pictureBox1.Image, 10,20);
                 //int margenX = 50;
                 //int margenY = 50;
                 int anchoHoja = 800;
                 int margenX = 25;
                 int margenY = 50;

                 PointF puntotitulo = new PointF();
                 puntotitulo.X = anchoHoja / 2;
                 puntotitulo.Y = margenY + 5;
                 
                 PointF puntosubtitulo = new PointF();
                 puntotitulo.X = anchoHoja / 2;
                 puntotitulo.Y = margenY + 10;
                 StringFormat formato = new StringFormat();
                 formato.Alignment = StringAlignment.Center;

               
                // Titulo    
                string pedidoidnro =  PedidoPrint.ped_id.ToString("00000000");             
                string fecha = DateTime.Now.Date.ToString("dd/MM/yyyy");
                int TitY = 40;
                e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);// 1ra Linea
                e.Graphics.DrawString("PRESUPUESTO", printFontTitulo, Brushes.Black, puntotitulo, formato);
                e.Graphics.DrawString("Número:", printFontSubTitulo, Brushes.Black, puntosubtitulo.X + 550, TitY, formato);
                e.Graphics.DrawString(pedidoidnro, printFontSubTitulo, Brushes.Black, puntosubtitulo.X + 600, TitY + 2);
                e.Graphics.DrawString("Fecha:", printFontSubTitulo, Brushes.Black, puntosubtitulo.X + 550,TitY + 30, formato);
                e.Graphics.DrawString(fecha, printFont, Brushes.Black, puntosubtitulo.X + 640, TitY + 30, formato);

                //Subtitulo
                int SubtitY = 130;
                int SubtitX = 130; 
                e.Graphics.DrawString("Cliente:", printFontSubTitulo, Brushes.Black, puntosubtitulo.X + 90, SubtitY, formato);
                e.Graphics.DrawString(PedidoPrint.Clientes.cliente_nombre, printFont, Brushes.Black, SubtitX, SubtitY);
                e.Graphics.DrawString("Dirección:", printFont, Brushes.Black, puntosubtitulo.X + 90, SubtitY + 20, formato);
                e.Graphics.DrawString(PedidoPrint.Clientes.cliente_direccion, printFont, Brushes.Black, SubtitX, SubtitY + 20);
                e.Graphics.DrawString("Localidad:", printFont, Brushes.Black, puntosubtitulo.X + 500, SubtitY + 20, formato);
                e.Graphics.DrawString(PedidoPrint.Clientes.cliente_localidad, printFont, Brushes.Black, SubtitX + 420, SubtitY + 20);

                e.Graphics.DrawLine(Pens.Black, 10, 180, 800, 180); // 2da Linea
                
                int posYencab = 205;
                String Cant = "Cantidad";
                e.Graphics.DrawString(Cant, printFontNormal10, Brushes.Black, 22, posYencab);
               
                String Cod = "Codigo Art.";
                e.Graphics.DrawString(Cod, printFontNormal10, Brushes.Black, 77, posYencab);
            
                String Art = "Articulo";
                e.Graphics.DrawString(Art, printFontNormal10, Brushes.Black, 310, posYencab);
                
                String PrecioU = "Precio U";
                e.Graphics.DrawString(PrecioU, printFontNormal10, Brushes.Black, 680, posYencab);
               
                String Importe = "Total";
                e.Graphics.DrawString(Importe, printFontNormal10, Brushes.Black, 750, posYencab);


                int posY = posYencab + 20;
                int anchoLinea = 18;
                int posCantidad = margenX + 15;
                int posCod = posCantidad + 42;
                int posArticulo = posCod + 60;
                int posPrecioU = posArticulo + 436;
                int posBonif = posPrecioU + 57;
                int posPrecioOf = posBonif + 52;
                int posPrecioT = posPrecioOf + 62;
                decimal total = 0;
                foreach (DataGridViewRow fila in dgvListaArt.Rows)
                {
                    e.Graphics.DrawString(fila.Cells["cantidad"].Value.ToString(), printFont, Brushes.Black, posCantidad, posY);
                   int cant = Convert.ToInt32(fila.Cells[1].Value);
                    e.Graphics.DrawString(fila.Cells["art_codigo"].Value.ToString(), printFont, Brushes.Black, posCod, posY);
                    e.Graphics.DrawString(fila.Cells["art_nombre"].Value.ToString(), printFont, Brushes.Black, posArticulo, posY);
                    e.Graphics.DrawString(fila.Cells["precio_bonificado"].Value.ToString(), printFont, Brushes.Black, posPrecioOf, posY);
                    decimal preciofinal = Math.Round((Convert.ToDecimal(fila.Cells[7].Value) * cant), 2);
                    e.Graphics.DrawString(preciofinal.ToString(), printFont, Brushes.Black, posPrecioT, posY);

                    posY += anchoLinea;
                    total += preciofinal;
                }

                int lineafin = 1025;
                int posSubtotX = 90;

                String tot = "TOTAL  $";
                e.Graphics.DrawString(tot, printFont, Brushes.Black, posSubtotX + 565, lineafin);

                e.Graphics.DrawString(Convert.ToString(total), printFont, Brushes.Black, posSubtotX + 650, lineafin);



             }

        private void dgvListaArt_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                eliminarArticulos();
            }

            if (e.KeyCode == Keys.Oemplus)
            {
                agregarArticulo();
            }
        }

        private void btnImprimirPresup_Click(object sender, EventArgs e)
        {
            Imprimir(pedaimprimir);
            this.Close();
        } 
    }
}
